流程分析
module_usb_driver
register/unregister usbtouch_driver
注册到总线接口的驱动是 usbtouch_driver
1 | static struct usb_driver usbtouch_driver = { |
name = “usbtouchscreen”
其中 id_table 的数据类型是 usb_device_id
1 | struct usb_device_id { |
只有这里的信息和 usb 设备驱动那边收集到的设备信息匹配上,才会调用进这个驱动。
id_table :
1 | static const struct usb_device_id usbtouch_devices[] = { |
USB_DEVICE 参数分别是 idVendor (厂商id)和 idProduct(产品id),一般用其作为设备标识
后面的 driver_info 是枚举值,会根据 driver_info 的值在 usbtouch_dev_info 中查找 driver 相关的配置
1 | /* device types */ |
这里只是枚举类型,真正的 driver_info 是 probe 中的 usbtouch_device_info *type;
这个 usbtouch_device_info 我们放在后面来分析
usbtouch_probe
1 | static int usbtouch_probe(struct usb_interface *intf, |
usbtouch_open
应用层打开触摸屏设备的时候,会调用
1 | static int usbtouch_open(struct input_dev *input) |
向usb core递交了在probe中构建好的中断urb,注意,此处是成功递交给usb core以后就返回,而不是等到从设备取得数据。
usbtouch_irq
当出现传输错误或获取到触摸屏数据后,urb回调函数将被执行
1 | static void usbtouch_irq(struct urb *urb) |
usbtouch_device_info
usbtouch_device_info 就是上面driver_info 以及usbtouch_probe 中抽取的驱动模块的info数组,不同的usbtouchscreen 注册的时候就是注册了一个枚举值,这个值就是usbtouch_dev_info 数组的第几元素.
1 | struct usbtouch_device_info { |
usbtouch_dev_info
这个数组的成员都是以前面说到的注册枚举值来区分. x y 参数及回调函数,都在 usbtouch_probe 中被抽离出来使用
1 | static struct usbtouch_device_info usbtouch_dev_info[] = { |